package org.iamd.security;

import java.util.UUID;

import org.iamd.domain.business.ApplicationException;

/**
 * Мениджър на сигурността. Предоставя функционалност за login и logout на
 * потребител (включително remote), филтрация на ресурс, връщане на текущ и
 * логнат потребител по подаден идентификатор. Конкретните имплементатори могат
 * да ползват различен доставчик на автентикация и оторизация, както и различни
 * типове обекти, които подлежат на филтрация.
 * 
 * @author И. Атанасов
 */
public interface ISecurityManager extends ISecurityService {

	/**
	 * Проверка дали текущия потребителски контекст има даденото право върху
	 * дадения обект.
	 * 
	 * @param res
	 *            ресурс
	 * @param permType
	 *            тип позволение
	 * 
	 * @throws SecurityException
	 *             ако ресурса не е позволен за текущия security контекст
	 */
	public void checkPermission(Object res, IPermissions permType) throws SecurityException;

	/**
	 * @return текущия потребителски контекст, асоцииран с потребителската
	 *         сесия. Aко в сесията няма валиден контекст - методът връща
	 *         <code>null</code> .
	 */
	public UserContext getCurrentSecurityContext();

	/**
	 * Разлогване на потребителя + clean up на релевантни ресурси. При неуспешен
	 * logout се хвърля {@link RuntimeException}.
	 */
	public void logoff();

	/**
	 * Прави опит за логин срещу избран доставчик на автентикация. Връщане на
	 * уникално id (session ticket) за успешно логнат потребител. Генерирания
	 * session ticket има timeout, след което става неактивен.
	 * 
	 * @param username
	 *            потребителско име
	 * @param password
	 *            парола
	 * 
	 * @return уникален идентификатор за успешно логнатия потребител
	 * 
	 * @throws SecurityException
	 *             при неуспешен логин (невалидно потребителско име или парола)
	 * @throws ApplicationException
	 *             при системна грешка
	 */
	public UUID logon(String username, String password) throws SecurityException,
			ApplicationException;

}